﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using Conexion;
using System.IO;
using System.Xml;

namespace Admin
{
    public partial class Form1 : Form
    {
        private static string IpManager;
        private static int PuertoManager;
        private const string CMD_AGREGAR = "01";
        private const string CMD_QUITAR = "02";

        public Form1()
        {
            InitializeComponent();
            CargarParametros();
        }

        private void CargarParametros()
        {
            //string path = "c://XmlCliente.xml";
            string path = "<?xml version='1.0'?>";
                   path +="<CONFIGURACION_ADMIN>";
	               path +="<MANAGER>";
                   path +="<IP>172.16.10.16</IP>";
                   path += "<PUERTO>5510</PUERTO>";
	               path +="</MANAGER>";
                   path +="</CONFIGURACION_ADMIN>";

            XmlDocument xDoc = new XmlDocument();
            xDoc.LoadXml(path);
           // xDoc.Load(path);

            #region // Carga información de Manager
            XmlNode managerNode = xDoc.SelectSingleNode("//CONFIGURACION_ADMIN//MANAGER");
            PuertoManager = int.Parse(managerNode.SelectSingleNode("PUERTO").InnerText);
            IpManager = managerNode.SelectSingleNode("IP").InnerText;          
            #endregion
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            progressBar1.Visible = true;
            lblResultado.ForeColor = Color.Black;

            AumentarBarra1(20);
            lblResultado.Text = "Estableciendo conexión..";
            
            TcpClient cliente = ClientTCP.obtenerTcpClient(IpManager, PuertoManager);
            string cmd = CrearComando(CMD_AGREGAR);
            bool exito = false;

            AumentarBarra1(50);
            lblResultado.Text = "Enviando datos..";
            StreamWriter str = new StreamWriter(cliente.GetStream());
            str.Write(cmd);
            str.Flush();

            string hdr = "";
            NetworkStream ns;
            byte[] datos = new byte[1024];

            lblResultado.Text = "Esperando respuesta..";
            ns = cliente.GetStream();

            AumentarBarra1(70);
            lblResultado.Text = "Procesando respuesta..";

            ns.Read(datos, 0, 3);
            hdr = Encoding.UTF8.GetString(datos).Substring(0, 3);

            if (hdr.Equals("RES"))
            {
                ns.Read(datos, 0, 2);
                string cmdRecibido = Encoding.UTF8.GetString(datos).Substring(0, 2);

                if (cmdRecibido.Equals(CMD_AGREGAR))
                {
                    ns.Read(datos, 0, 1);
                    exito = (Encoding.UTF8.GetString(datos).Substring(0, 2).Equals("0"));
                }
            }

            if (exito)
            {
                lblResultado.ForeColor = Color.Green;
                lblResultado.Text = "Exito";
            }
            else
            {
                lblResultado.ForeColor = Color.Red;
                lblResultado.Text = "Error";
            }

            AumentarBarra1(100);
            progressBar1.Visible = false;
        }

        private void AumentarBarra1(int valorHasta)
        {
            for (int i = progressBar1.Value; i < valorHasta; i++)
            {
                progressBar1.Value = i;
            }
        }

        private void AumentarBarra2(int valorHasta)
        {
            for (int i = progressBar2.Value; i < valorHasta; i++)
            {
                progressBar2.Value = i;
            }
        }

        private string CrearComando(string cmd)
        {
            string comando = "REQ";
            switch (cmd)
            {
                case CMD_AGREGAR:
                    {
                        comando += CMD_AGREGAR;
                        comando += txtIPAgregar.Text.PadLeft(15, '0');
                        comando += txtPuertoAgregar.Text.PadLeft(5, '0');
                        break;
                    }
                case CMD_QUITAR:
                    {
                        comando += CMD_QUITAR;
                        comando += txtIpQuitar.Text.PadLeft(15, '0');
                        break;
                    }
            }           
            return comando;
        }

        private void agregarServidorToolStripMenuItem_Click(object sender, EventArgs e)
        {
            grpQuitar.Visible = false;
            grpAgregar.Visible = true;
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            progressBar2.Visible = true;
            lblResultado2.ForeColor = Color.Black;

            AumentarBarra2(20);
            lblResultado2.Text = "Estableciendo conexión..";

            TcpClient cliente = ClientTCP.obtenerTcpClient(IpManager, PuertoManager);
            string cmd = CrearComando(CMD_QUITAR);
            bool exito = false;

            AumentarBarra2(50);
            lblResultado2.Text = "Enviando datos..";
            StreamWriter str = new StreamWriter(cliente.GetStream());
            str.Write(cmd);
            str.Flush();

            string hdr = "";
            NetworkStream ns;
            byte[] datos = new byte[1024];

            lblResultado2.Text = "Esperando respuesta..";
            ns = cliente.GetStream();

            AumentarBarra2(70);
            lblResultado2.Text = "Procesando respuesta..";

            ns.Read(datos, 0, 3);
            hdr = Encoding.UTF8.GetString(datos).Substring(0, 3);

            if (hdr.Equals("RES"))
            {
                ns.Read(datos, 0, 2);
                string cmdRecibido = Encoding.UTF8.GetString(datos).Substring(0, 2);

                if (cmdRecibido.Equals(CMD_QUITAR))
                {
                    ns.Read(datos, 0, 1);
                    exito = (Encoding.UTF8.GetString(datos).Substring(0, 2).Equals("0"));
                }
            }

            if (exito)
            {
                lblResultado2.ForeColor = Color.Green;
                lblResultado2.Text = "Exito";
            }
            else
            {
                lblResultado2.ForeColor = Color.Red;
                lblResultado2.Text = "Error";
            }

            AumentarBarra2(100);
            progressBar2.Visible = false;
        }

        private void quitarServidorToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Controls.Add(this.grpAgregar);
            grpQuitar.Visible = true;
        }

        private void salirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }       
    }
}
